package main

import "fmt"

func main() {
	nums := []int{-2, -2, 1, 1, 4, 1, 4, 4, -4, -2}
	fmt.Println(singleNumberByMap(nums))
	fmt.Println(singleNumberByBit(nums))

}

//大佬的讲解很不错[https://leetcode-cn.com/problems/single-number-ii/solution/dong-hua-tu-jie-yi-ding-neng-hui-by-yuan-bn22/]

//给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
/**
 * @Description:借助map来实现
 */
func singleNumberByMap(nums []int) int {
	resultMap := make(map[int]int)
	for _, num := range nums {
		resultMap[num] += 1
	}

	for index, value := range resultMap {
		if value == 1 {
			return index
		}
	}
	return 0
}

/**
 * @Description:采用位移实现，注意坑 java中int就是32位，而go中要强转32
 */
func singleNumberByBit(nums []int) int {
	result := int32(0)
	for i := 0; i < 32; i++ {
		count := int32(0)
		for _, num := range nums {
			if (int32(num) >> i & 1) == 1 {
				count++
			}
		}
		if count%3 != 0 {
			result |= 1 << i
		}
	}
	return int(result)
}
